#pragma once
#include <cstdint>
#include <ctime>
#include <string>
#include <unistd.h>
#include <iostream>
#include <set>
#include <sys/signal.h>

//////////////OpenCV///////////////
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/calib3d.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/video/tracking.hpp>
#include "GxIAPI.h"
#include "DxImageProc.h"


//////////namespace/////////////
using namespace std;
using namespace cv;


void showPicture(std::string window_name, const cv::Mat &picture, int time);

void GetErrorString(GX_STATUS error_status);

uint64_t getTickCountMs();

/**
 * @brief 检查某个类型是否是另一个类型的子类
*/
template <typename Base, typename Derived>
static constexpr bool instanceOf();

/**
 * @brief 获取当前程序的最上级目录的路径，即ComputerVision/的路径
*/
std::string getPath();

/**
 * @brief 获取当前程序的config文件夹的路径，即ComputerVision/config/的路径
*/
std::string getConfigPath();

/**
 * @brief 将str中的old_value全部替换为new_value.但是不改变str的内容
 * @return 返回值是替换之后的结果
*/
string replace(const string& old_value, const string& new_value, const string& str);

/**
 * @brief 将str中的old_value全部替换为new_value.直接在str本身上面进行改动
 * @return void
*/
inline void replaceSrc(const string& old_value, const string& new_value, string& str);
